-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix:blank page appears in validate code form page #55588
base: main
Are you sure you want to change the base?
Conversation
@hoangzinh Another issue from other branch bother testing. Should we handle this bug too?(If we don't then we can't test on iOS) 2025-01-28.3.18.24.movProcess:
|
App/src/pages/settings/Profile/Contacts/ContactMethodDetailsPage.tsx Lines 171 to 173 in 433778f
This line makes this issue cc: @nkdengineer |
@hoangzinh Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
@jacobkim9881 is it reproducible if we click on "unverified" contact method in the 1st step? |
@hoangzinh It isn't reproducible if clicking 1st time so it isn't unrelated with the PR. Thanks for clarifying! |
|
||
type ValidateCodeActionProps = ValidateCodeActionModalProps & ValidateCodeActionWithoutModalProps; | ||
|
||
function ValidateCodeActionWithoutModal({ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you have any other names for this component? It seems is not a good name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have updated it to ValidateCodeActionForm
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since it shares ValidateCodeActionModalProps
, I think ValidateCodeAction
should be included. It has the form element and has props to run actions. I think ValidateCodeActionForm
can be properly used. Please to tell me if you have any idea though.
<ScrollView keyboardShouldPersistTaps="handled"> | ||
<ScrollView | ||
keyboardShouldPersistTaps="handled" | ||
contentContainerStyle={themeStyles.flex1} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you elaborate why do we need this style?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This style makes put "Verify" button to bottom. W/o the style the button will be placed beneath validate code form.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ping @jacobkim9881 again ^
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The elements can fit the necessary space. The explain, form and button elements are placed in its position with this style.
{!loginData?.validatedDate && ( | ||
<ValidateCodeActionWithoutModal | ||
hasMagicCodeBeenSent={hasMagicCodeBeenSent} | ||
isVisible={isValidateCodeActionModalVisible && !loginData.validatedDate && !!loginData} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should control the visibility of this component in line 323 instead of a prop. What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Before it is controled with isVisible
in <ValidateCodeActionModal>
. I think it should be controlled in <ValidateCodeActionWithoutModal>
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Before it is controled with isVisible in
isVisible={isVisible} |
|
||
{!isValidateCodeActionModalVisible && getMenuItems()} | ||
{!isValidateCodeActionModalVisible && !!loginData?.validatedDate && getMenuItems()} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you elaborate why do we need add an extra condition here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
W/o it, trash can will show when navigating out on Android mWeb.
expensify-test19-2025-02-02_12.45.08.mp4
useEffect( | ||
() => () => { | ||
firstRenderRef.current = true; | ||
}, | ||
[], | ||
); | ||
|
||
useEffect(() => { | ||
if (!firstRenderRef.current || !isVisible || hasMagicCodeBeenSent) { | ||
return () => { | ||
clearError(); | ||
}; | ||
} | ||
firstRenderRef.current = false; | ||
sendValidateCode(); | ||
}, [isVisible, sendValidateCode, hasMagicCodeBeenSent, clearError]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it's not a modal. Do we need firstRenderRef
or isVisible
anymore?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
W/o it, it will send validate code in validated contact method or default method. It only sends validate code in validate code page only.
Hi @jacobkim9881 is the PR ready for review? |
I also have some feedbacks above. Please take a look when you have time. Thank you. |
@hoangzinh Pardon, please to let me check 1. |
@hoangzinh PR is ready for review. |
When you have a time, please to take a look at this. Since focus processing is adjusted, this behavior is changed. I am not sure which is more easy for users. W/o Android and iOS mWeb, all has the behavior for main branch. expensify-test-20-2025-02-04_20.53.33.mp4Dev main branch: expensify-test-21-2025-02-04_20.55.41.mp4 |
@jacobkim9881, Sorry can you describe what was changed? I tried to watch 2 recordings and can't realize what are differents. |
@hoangzinh At 00:08 the keyboard showing. but I think I made a noise. I can't see something too while seeing again. |
focusTrapOptions: isMobileSafari() | ||
? undefined |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jacobkim9881 will it cause any issue if we apply it for mweb Safari too?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It bothers keyboard showing on mWeb Safari:
REC-20250205094156.mp4
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On mWeb Safari, number pad shows at contact method page. It is because of onActive
event fired by focus trap. Number pad gets ready for putting numbers on the validate form. On the screen, contact method page is seen still but focusing is on validate form. As a result before transition animation shows, number pad shows earlier.
<ScrollView keyboardShouldPersistTaps="handled"> | ||
<ScrollView | ||
keyboardShouldPersistTaps="handled" | ||
contentContainerStyle={themeStyles.flex1} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ping @jacobkim9881 again ^
<ValidateCodeActionModal | ||
title={formattedContactMethod} | ||
onModalHide={() => {}} | ||
<ValidateCodeActionForm |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
<ValidateCodeActionForm | |
{isValidateCodeFormVisible && !loginData.validatedDate && !!loginData && <ValidateCodeActionForm |
Why don't we display/hide ValidateCodeActionForm
here? But we prefer to pass isVisible prop into ValidateCodeActionForm
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We have used isVisible
for the modal though.
Oops, pardon for my mistake! |
@jacobkim9881 please let me know when the PR is ready for next review |
@hoangzinh I have replied and the PR is ready for next review. |
@jacobkim9881 could you check review feedbacks again? I couldn't find answer of #55588 (comment) and #55588 (comment) |
I just added answers. Please to review. |
{isValidateCodeFormVisible && !loginData.validatedDate && !!loginData && ( | ||
<ValidateCodeActionForm | ||
hasMagicCodeBeenSent={hasMagicCodeBeenSent} | ||
isVisible={isValidateCodeFormVisible && !loginData.validatedDate && !!loginData} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jacobkim9881 Do we need this prop anymore? 👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need isVisble
prop for executing clear function inside. For example, when navigating out from the validating code page, it clears validating error or other errors with RBR.
App/src/components/ValidateCodeActionForm.tsx
Lines 47 to 51 in 0e4b20f
if (!firstRenderRef.current || !isVisible || hasMagicCodeBeenSent) { | |
return () => { | |
clearError(); | |
}; | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it always works without isVisible
there. What do you think? Can you try to remove isVisible
condition check and test again?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it will works without isVisible
too since clear function works when the component is closed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you try to remove isVisible condition check and test again?
It works without isVisible
but I found an issue. Whenever opening default contact method, the clear function is executed so to run clearError()
too. Clear function and clearError
should run in validate code page only. Let me update the PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean as you can see the value of prop isVisible
isVisible={isValidateCodeFormVisible && !loginData.validatedDate && !!loginData} |
is same as condition to render ValidateCodeActionForm
in line 321
App/src/pages/settings/Profile/Contacts/ContactMethodDetailsPage.tsx
Lines 321 to 322 in bc83a7b
{isValidateCodeFormVisible && !loginData.validatedDate && !!loginData && ( | |
<ValidateCodeActionForm |
therefore I am concerned is there any way that isVisible=false
inside ValidateCodeActionForm
component? Because if it's false, it means component is unmounted
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was an exception. I checked clear function runs when <ValidateCodeActionForm>
unmounted by line 321. It was on mWeb Safari and desktop app. However I agree with you. isVisible
already has at line 321 {isValidateCodeFormVisible && !loginData.validatedDate && !!loginData &&
. It looks redundant if there are 2 of isVisible
s.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you going to clean up isVisible
? I feel we don't really need it. isVisible = false
is the same as unmounting the component.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let me update without isVisible
since it is at line 321.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hoangzinh Updated!
Pardon. I thought it is commented with pending label. I have submitted my pending review. |
Explanation of Change
This PR replaces
<ValidateCodeActionModal>
with<ValidateCodeActionForm>
inContactMethodDetailsPage
as it creates<ValidateCodeActionForm>
component. This component doesn't haveHeaderWithBackButton
orModal
so it can be used in any page that needs validate code form but it can uses props for<ValidateCodeActionModal>
.Fixed Issues
$ #53884
PROPOSAL:$ #53884 (comment)
Tests
Preparation
Test
Offline tests
Preparation
Test
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
Preparation
Test
PR Author Checklist
### Fixed Issues
section aboveTests
sectionOffline steps
sectionQA steps
sectiontoggleReport
and notonIconClick
)src/languages/*
files and using the translation methodSTYLE.md
) were followedAvatar
, I verified the components usingAvatar
are working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
)Avatar
is modified, I verified thatAvatar
is working as expected in all cases)Design
label and/or tagged@Expensify/design
so the design team can review the changes.ScrollView
component to make it scrollable when more elements are added to the page.main
branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTest
steps.Screenshots/Videos
Android: Native
expensify-test15-2025-01-29_05.23.39.mp4
Android: mWeb Chrome
expensify-test16-2025-01-29_05.28.07.mp4
iOS: Native
2025-01-29.5.18.03.mov
iOS: mWeb Safari
2025-01-29.5.19.48.mov
MacOS: Chrome / Safari
expensify-test14-2025-01-29_05.12.06.mp4
MacOS: Desktop
2025-01-29.5.30.16.mov